#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QPushButton>
#include <QDebug>
#include <QToolButton>
#include <QLabel>
#include <QComboBox>
#include <QToolBar>
#include <QVBoxLayout>
#include <QGridLayout>
#include "Qt_Object/QVideoWidget.h"
#include "PlayMangent.h"
#include "Data/FileInfo.h"
#include "DesignPattern/ISubject.h"
#include "DesignPattern/NoDataObserver.h" // 包含 NoDataObserver.h
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow , public  NoDataObserver,public std::enable_shared_from_this<MainWindow>
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void registerSelf() {
        // 获取自身的 shared_ptr 对象
        std::shared_ptr<Observer> self = shared_from_this();
        // 注册观察者
        PlayMangent::get_instance().registerObserver(self);

    }
    // 重写 Observer 接口的 accept 方法
    void accept(ObserverVisitor& visitor, ISubject* subject) override {
        visitor.visitNoDataObserver(static_cast<NoDataObserver*>(this), subject);
    }
    // 重写 Observer 接口的 onPlaybackStarted 方法
    void onPlaybackStarted() override;
    // 重写 Observer 接口的 onPlaybackStopped 方法
    void onPlaybackStopped() override;
private slots:
//button deal
    void onButton_openFileclicked();   // 添加文件按钮点击槽函数
    void onStopButtonClicked();        // 停止按钮点击槽函数
    void onPauseButtonClicked();        // 暂停按钮点击槽函数
    void onNextButtonClicked();     // 下一个按钮点击槽函数
    void onPreviousButtonClicked();     // 上一个按钮点击槽函数
    void onSpeedSelectorChanged(int);    // 变速按钮点击槽函数
    void onToggleResizeButtonClicked(bool checked); // 切换全屏按钮点击槽函数
    void onPlayButtonClicked();     // 播放按钮点击槽函数
public slots:

    void onFileInformationReceived(const FileInfo& info); // 文件信息接收槽函数

private:
    enum ButtonType {   // 按钮类型枚举
        PlayButton,
        StopButton,
        PauseButton,
        NextButton,
        PreviousButton,
        VariableSpeedButton
    };
private:
    Ui::MainWindow *ui;
    QVideoWidget *video_widget;  // 视频显示区域
    QLabel *labelFilename;        // 文件名标签
    QLabel *labelDuration;      // 时长标签
    QLabel *labelBitrate;       // 比特率标签
    QLabel *labelMediaType;     // 媒体类型标签
    QLabel *labelAudioType;     // 音频类型标签
    QGridLayout *fileInfoLayout;      // 文件信息布局
    QWidget *fileInfoWidget;        // 文件信息窗口
    QLabel *fileInfoLabel;      // 文件信息标签
    QHBoxLayout *status_filename_layout;    // 状态标签和文件名标签的水平布局
    QVBoxLayout *status_layout;    // 状态标签和按钮区域的垂直布局
    QLabel *label_status;    // 状态标签
    QLabel *label_filename;   // 文件名标签
    QVBoxLayout *main_layout;   // 主布局
    QPushButton *button_openFile;   // 打开按钮
    QPushButton *button_stop;   // 停止按钮
    QPushButton *button_pause;  // 暂停按钮  
    QPushButton *button_next;   // 下一个按钮
    QPushButton *button_previous;   // 上一个按钮   
    QPushButton *button_play;   // 播放按钮
    QGridLayout *button_layout;  // 按钮布局
    QComboBox *speed_selector;  // 变速按钮 
    QToolButton *toggleResizeButton;   // 切换全屏按钮  
    bool allowResize;   // 是否允许切换全屏
    bool isInit;   // 是否初始化    
private:
    void _init();    // 初始化
    void createVideoArea();        // 创建视频显示区域
    void createButtonArea();         // 创建按钮区域
    void createInfoArea();           // 创建文件信息区域
    void centerDisplay();           // 居中显示

    void createStatusLabel();        // 创建状态标签
    void createMainLayout();         // 创建主布局
    void createStatusFilenameLayout(); // 创建状态标签和文件名标签的水平布局
    void createStatusLayout();       // 创建状态标签和按钮区域的垂直布局
    void createButtons();            // 创建按钮    
    void loadButtonStyleSheet(const QString &filePath); // 加载按钮样式表
    void handleButtonClick(ButtonType buttonType);  // 处理按钮点击事件
    void createToggleResizeButton(bool);    // 创建切换全屏按钮
    void updateStatus(bool isActive); // 更新状态标签的样式

};
#endif // MAINWINDOW_H
